package br.usp.ime.protoc.pessoa;

import java.util.HashSet;
import java.util.Iterator;

import br.usp.ime.protoc.fujaba.FEmptyIterator;
import br.usp.ime.protoc.genotipagem.Genotipagem;

import com.google.gwt.user.client.rpc.IsSerializable;

public abstract class Pessoa implements IsSerializable
{
   private String cpf;

   public String getCpf()
   {
      return this.cpf;
   }

   public void setCpf(String value)
   {
      if (this.cpf != value)
      {
         
         this.cpf = value;
         
      }
   }

   private String dataNascimento;

   public String getDataNascimento()
   {
      return this.dataNascimento;
   }

   public void setDataNascimento(String value)
   {
      if (this.dataNascimento != value)
      {
         
         this.dataNascimento = value;
         
      }
   }

   private String email;

   public String getEmail()
   {
      return this.email;
   }

   public void setEmail(String value)
   {
      if (this.email != value)
      {
         
         this.email = value;
         
      }
   }

   private int id;

   public int getId()
   {
      return this.id;
   }

   public void setId(int value)
   {
      if (this.id != value)
      {
         
         this.id = value;
         
      }
   }

   private String nome;

   public String getNome()
   {
      return this.nome;
   }

   public void setNome(String value)
   {
      if (this.nome != value)
      {
         
         this.nome = value;
         
      }
   }

   /**
    * <pre>
    *         1..*      has      1 
    * Pessoa ---------------------- Endereco
    *         pessoa      endereco 
    * </pre>
    */
   private Endereco endereco;

   public Endereco getEndereco()
   {
      return this.endereco;
   }

   public boolean setEndereco(Endereco value)
   {
      boolean changed = false;
      if (this.endereco != value)
      {
         Endereco oldValue = this.endereco;
         
         if (this.endereco != null)
         {
            this.endereco = null;
            oldValue.removeFromPessoa (this);
         }
         this.endereco = value;
         if (value != null)
         {
            value.addToPessoa (this);
         }
         changed = true;
         
      }
      return changed;
   }

   /**
    * <pre>
    *         1         has         1 
    * Pessoa ------------------------- Genotipagem
    *         pessoa      genotipagem 
    * </pre>
    */
   private Genotipagem genotipagem;

   public Genotipagem getGenotipagem()
   {
      return this.genotipagem;
   }

   public boolean setGenotipagem(Genotipagem value)
   {
      boolean changed = false;
      if (this.genotipagem != value)
      {
         Genotipagem oldValue = this.genotipagem;
         
         if (this.genotipagem != null)
         {
            this.genotipagem = null;
            oldValue.setPessoa (null);
         }
         this.genotipagem = value;
         if (value != null)
         {
            value.setPessoa (this);
         }
         changed = true;
         
      }
      return changed;
   }

   /**
    * <pre>
    *         1..*    has     1..* 
    * Pessoa ---------------------- Telefone
    *         pessoa      telefone 
    * </pre>
    */
   private HashSet telefone;

   public boolean addToTelefone(Telefone value)
   {
      boolean changed = false;
      if (value != null)
      {
         if (this.telefone == null)
         {
            this.telefone = new HashSet (); // or FTreeSet () or FLinkedList ()
         }
         
         changed = this.telefone.add (value);
         if (changed)
         {
            value.addToPessoa (this);
         }
         
      }
      return changed;
   }

   public boolean hasInTelefone(Telefone value)
   {
      return ((this.telefone != null) &&
              (value != null) &&
              this.telefone.contains (value));
   }

   public Iterator iteratorOfTelefone()
   {
      return ((this.telefone == null)
              ? FEmptyIterator.get ()
              : this.telefone.iterator ());
   }

   public void removeAllFromTelefone()
   {
      Telefone tmpValue;
      Iterator iter = this.iteratorOfTelefone ();
      while (iter.hasNext ())
      {
         tmpValue = (Telefone) iter.next ();
         this.removeFromTelefone (tmpValue);
      }
   }

   public boolean removeFromTelefone(Telefone value)
   {
      boolean changed = false;
      if ((this.telefone != null) && (value != null))
      {
         
         changed = this.telefone.remove (value);
         if (changed)
         {
            value.removeFromPessoa (this);
         }
         
      }
      return changed;
   }

   public int sizeOfTelefone()
   {
      return ((this.telefone == null)
              ? 0
              : this.telefone.size ());
   }

   public void removeYou()
   {
      Endereco tmpEndereco = getEndereco ();
      if (tmpEndereco != null)
      {
         setEndereco (null);
      }
      removeAllFromTelefone ();
      Genotipagem tmpGenotipagem = getGenotipagem ();
      if (tmpGenotipagem != null)
      {
         setGenotipagem (null);
      }
   }

}
